package com.skyd.core.game.td;

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Hashtable;

import com.skyd.core.common.Point;
import com.skyd.core.vector.Vector2DF;

public class TDBiont extends TDActor implements ITDBiont {
	
	/**
	 * 上次移动时间
	 */
	private long lastMoveTime=0;

	/**
	 * 初始值为null。 功能注释：行进路线
	 */
	private CopyOnWriteArrayList<Vector2DF> _Route = null;

	/**
	 * 获取Route。 功能注释：行进路线
	 * 
	 * @return 当前的CopyOnWriteArrayList<Vector2DF>类型的值
	 */
	public CopyOnWriteArrayList<Vector2DF> getRoute() {
		return _Route;
	}

	/**
	 * 设置Route。 功能注释：行进路线
	 * 
	 * @param value
	 *            要设置的CopyOnWriteArrayList<Vector2DF>类型值
	 */
	public void setRoute(CopyOnWriteArrayList<Vector2DF> value) {
		_Route = value;
		setCurrentRouteIndex(0);
	}

	/**
	 * 设置Route为其默认值(null)。 功能注释：行进路线
	 */
	public void setRouteToDefault() {
		setRoute(null);
	}

	/**
	 * 初始值为0。 功能注释：当前进行到的路线索引
	 */
	private int _CurrentRouteIndex = -1;

	/**
	 * 获取CurrentRouteIndex。 功能注释：当前进行到的路线索引
	 * 
	 * @return 当前的int类型的值
	 */
	protected int getCurrentRouteIndex() {
		return _CurrentRouteIndex;
	}

	/**
	 * 设置CurrentRouteIndex。 功能注释：当前进行到的路线索引
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	protected void setCurrentRouteIndex(int value) {
		_CurrentRouteIndex = value;
	}

	/**
	 * 设置CurrentRouteIndex为其默认值(-1)。 功能注释：当前进行到的路线索引
	 */
	protected void setCurrentRouteIndexToDefault() {
		setCurrentRouteIndex(-1);
	}

	@Override
	public void update() {
		if(getEffect()!=null)getEffect().update();
		if(getCurrentTime()-lastMoveTime>getFinalStatus().getMoveDelay()){
			move();
		}
	}

	/**
	 * 移动
	 */
	protected void move() {
		if(getIsDead()||getRoute()==null||getCurrentRouteIndex()<0||getCurrentRouteIndex()>=getRoute().size())return;
		Vector2DF p = getPosition();
		Vector2DF t = getRoute().get(getCurrentRouteIndex());
		float d = t.minusNew(p).getAngle();
		setPosition(p.plusNew(new Vector2DF(getFinalStatus().getSpeed(), 0).setAngle(d)));
		if(p.minusNew(t).getLength()<=getFinalStatus().getSpeed()){
			setCurrentRouteIndex(getCurrentRouteIndex()+1);
		}
		else{
			if(d<0)setDirection(360-d*-1);
			else setDirection(d);
		}
		OnMove(t);
	}
	
	public static Hashtable<String, CopyOnWriteArrayList<Vector2DF>> routeTable=new Hashtable<String, CopyOnWriteArrayList<Vector2DF>>();

	@Override
	public void findRoute(Point start, Point end,boolean containStartPosion) {
		String str = start+"|"+end+"|"+containStartPosion+"|"+getIsAirUnits()+"|"+getRadius();
		if(routeTable.containsKey(str))setRoute(routeTable.get(str));
		else{
			ITDMap map = TDWorld.getInstance().getMap();
			CopyOnWriteArrayList<Vector2DF> r = map.getPiece(start).planningRoute(map.getPiece(end), containStartPosion, getIsAirUnits());
			if(containStartPosion)r.add(map.getPiece(start).getCenterPosion());
			routeTable.put(str, r);
			setRoute(r);
		}
	}

}
